<

ナビゲーターとヒーロー コントローラーのスコープにおけるより厳密なアサーション

まとめ

フレームワークは、存在することを検出するとアサーション エラーをスローします。 複数のナビゲータが 1 つのヒーロー コントローラ スコープに登録されています。

コンテクスト

ヒーロー コントローラー スコープは、ウィジェットのヒーロー コントローラーをホストします。 サブツリー。ヒーロー コントローラーは、次の時点で 1 つのナビゲーターのみをサポートできます。 時間。以前は、それを保証するアサーションはありませんでした。

変更内容の説明

この変更後にコードがアサーション エラーをスローし始めた場合、 これは、この変更の前からコードがすでに壊れていたことを意味します。 同じヒーローの下に複数のナビゲーターを登録することができます コントローラー スコープでは、ヒーロー アニメーションをトリガーできません。 彼らのルートは変わります。この変更により、この問題が表面化しただけです。

移行ガイド

例外をスローし始めるアプリケーションの例。

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      builder: (BuildContext context, Widget child) {
        // Builds two parallel navigators. This throws
        // error because both of navigators are under the same
        // hero controller scope created by MaterialApp.
        return Stack(
          children: <Widget>[
            Navigator(
              onGenerateRoute: (RouteSettings settings) {
                return MaterialPageRoute<void>(
                  settings: settings,
                  builder: (BuildContext context) {
                    return const Text('first Navigator');
                  }
                );
              },
            ),
            Navigator(
              onGenerateRoute: (RouteSettings settings) {
                return MaterialPageRoute<void>(
                  settings: settings,
                  builder: (BuildContext context) {
                    return const Text('Second Navigator');
                  }
                );
              },
            ),
          ],
        );
      }
    )
  );
}

独自のヒーロー コントローラー スコープを導入することで、このアプリケーションを修正できます。

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      builder: (BuildContext context, Widget child) {
        // Builds two parallel navigators.
        return Stack(
          children: <Widget>[
            HeroControllerScope(
              controller: MaterialApp.createMaterialHeroController(),
              child: Navigator(
                onGenerateRoute: (RouteSettings settings) {
                  return MaterialPageRoute<void>(
                    settings: settings,
                    builder: (BuildContext context) {
                      return const Text('first Navigator');
                    }
                  );
                },
              ),
            ),
            HeroControllerScope(
              controller: MaterialApp.createMaterialHeroController(),
              child: Navigator(
                onGenerateRoute: (RouteSettings settings) {
                  return MaterialPageRoute<void>(
                    settings: settings,
                    builder: (BuildContext context) {
                      return const Text('second Navigator');
                    }
                  );
                },
              ),
            ),
          ],
        );
      }
    )
  );
}

タイムライン

リリースされたバージョン: 1.20.0
安定版リリース: 1.20

参考文献

API ドキュメント:

  • Navigator
  • HeroController
  • HeroControllerScope

関連する問題:

  • 問題 45938

関連する PR:

  • ヒーロー コントローラー スコープをクリーンアップする